/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tida.servir.pages;

import com.tida.servir.base.GeneralPage;
import com.tida.servir.components.Envelope;
import com.tida.servir.entities.*;
import com.tida.servir.services.GenericSelectModel;
import helpers.Encriptacion;
import helpers.Helpers;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.ajax.MultiZoneUpdate;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.services.Cookies;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author arson
 */
public class AnularSancion extends GeneralPage {

    @Persist
    @Property
    private String bdenoentidad;
    @Inject
    private Session session;
    @SessionState
    private Usuario loggedUser;
    @InjectComponent
    private Envelope envelope;
    @Component(id = "formularioanularsancion")
    private Form formularioanularsancion;
    @Component(id = "formmensaje")
    private Form formmensaje;
    @Persist
    @Property
    private String entidad_origen;
    @InjectComponent
    @Property
    private Zone busZone2;
    @InjectComponent
    @Property
    private Zone mensajeZone;
//    @InjectComponent
//    @Property
//    private Zone busZone;
    @Persist
    @Property
    private DatoAuxiliar bdocumentoidentidad;
    @Persist
    @Property
    private DatoAuxiliar bdocumentoidentidad2;
    @Persist
    @Property
    private DatoAuxiliar bdocumentoidentidad_not;
    @Persist
    @Property
    private String bnumeroDocumento;
    @Persist
    @Property
    private String bnumeroDocumento2;
    @Persist
    @Property
    private String bnumeroDocumento_not;
    @Persist
    @Property
    private String observaciones;
    @Property
    @Persist
    private String fechadoc;
    @Property
    @Persist
    private Date fecha_doc;
    @Property
    @Persist
    private String fechadocnot;
    @Property
    @Persist
    private Date fechadoc_not;
    @Persist
    @Property
    private String juzgado_not;
    @Inject
    private PropertyAccess _access;
    @Property
    @Persist
    private LkBusquedaEntidad entio;
    @Property
    @Persist
    private Suspension nuevasuspension;
    @Property
    @Persist
    private Anulacion anulacion;
    @PageActivationContext
    private Sancion modificasancion;
    private int elemento = 0;
    @Property
    @Persist
    private String texto;
    @Inject
    private Cookies galleta;
    @Inject
    private ComponentResources resources;

    @Log
    @SetupRender
    private void inicio() {
        onLimpiar();
        anulacion = new Anulacion();
        anulacion.setId_sancion(modificasancion);
//        modificasancion.setSancion(modificasancion);
        texto = "Persona Sancionada: " + modificasancion.getPersona().getApellidoPaterno() + " " + modificasancion.getPersona().getApellidoMaterno() + " " + modificasancion.getPersona().getNombres();
        formmensaje.clearErrors();

    }

    @Log
    public Sancion getModificasancion() {
        return modificasancion;
    }

    public void setModificasancion(Sancion modificasancion) {
        this.modificasancion = modificasancion;
    }
    
    @Log
    public String onActivate() {
//        Query query = session.getNamedQuery("callSpUsuarioAccesoPagina");
//        query.setParameter("in_login", loggedUser.getLogin());
//        query.setParameter("in_pagename", resources.getPageName().toUpperCase());
//        List result = query.list();
//        if (result.isEmpty()) {
//            return "Alerta";
//        }
        //Valida si viene del enlace de busqueda
        if (modificasancion != null) {
            if (galleta.readCookieValue("_67646d8fee24c82ba512c519c16b2302").equals(Encriptacion.MD5(String.valueOf(modificasancion.getId()))) == false) {
                return "Alerta";
            }
        } else {
                return "Alerta";
        }
        return null;
    }

    @Log
    public GenericSelectModel<DatoAuxiliar> getTiposDoc() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPODOCUMENTO", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

//    @Log
//    public List<Entidad> getEntidades() {
//        Criteria c = session.createCriteria(LkBusquedaEntidad.class);
//        if (bdenoentidad != null && !bdenoentidad.equals("")) {
//            c.add(Restrictions.disjunction().add(Restrictions.like("denominacion", "%" + bdenoentidad + "%").ignoreCase()));
//        }
//        return c.list();
//    }

//    @Log
//    Object onActionFromSeleccionar(Entidad enti2) {        
//        entidad2 = enti2;
//        entidad_origen=entidad2.getDenominacion();
//        entidad_origen_id = entidad2.getId();
//        return busZone2.getBody();  
//    }
//    Object onBuscarentidad(){
//         //return busZone.getBody();
//          return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("busZone", busZone.getBody());
//      } 
    @Log
    Object onLimpiar() {
        entidad_origen = null;
        bnumeroDocumento_not = null;
        observaciones = null;
        juzgado_not = null;
        bnumeroDocumento2 = null;
        fechadoc = null;
        fechadocnot = null;
        return busZone2.getBody();
    }

//    @Log
//    Object onCancel1() {
//        return "ConsultaSanciones";
//    }

    @Log
    void onSelectedFromSave() {
        elemento = 1;
    }

    @Log
    @CommitAfter
    Object onSuccessFromFormularioAnularSancion() {
        formmensaje.clearErrors();
        if (elemento == 1) {
            if (entidad_origen == null) {
                envelope.setContents("Tiene que ingresar una Entidad");
                return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
            }
            if (bnumeroDocumento2 == null) {
                envelope.setContents("Falta el Numero de documento");
                return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
            }
            if (fechadoc == null) {
                envelope.setContents("Falta la Fecha del Documento");
                return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
            }
            if (bnumeroDocumento_not == null) {
                envelope.setContents("Falta el Numero de documento de Notificacion");
                return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
            }
            if (fechadocnot == null) {
                envelope.setContents("Falta la Fecha del Documento de Notificacion");
                return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
            }
            if (fechadocnot != null) {
                SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
                try {
                    fechadoc_not = ((Date) formatoDelTexto.parse(fechadocnot));
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }
            }

            if (fechadoc != null) {
                SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
                try {
                    anulacion.setFecha_doc_san((Date) formatoDelTexto.parse(fechadoc));
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }
            }
            if (anulacion.getFecha_doc_san().after(new Date())) {
                envelope.setContents("La fecha del Documento de Anulación debe ser menor o igual a la Fecha Actual");
                return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
            }
            if (modificasancion.getFechaini_inha() != null) {
                if (anulacion.getFecha_doc_san().before(modificasancion.getFechaini_inha())) {
                    envelope.setContents("La fecha del Documento de Anulación debe ser mayor a la Fecha Inicial de la Sanción");
                    return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
                }
            }
            if (anulacion.getFecha_doc_san().after(fechadoc_not)) {
           
                envelope.setContents("La fecha del Documento de Anulación debe ser menor o igual a la Fecha de Notificación");

                return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
            }
            
            if (fechadoc_not.after(new Date())) {
                envelope.setContents("La fecha del Documento de Notificación debe ser menor o igual a la fecha Actual");
                return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
            }
            
            if (modificasancion.getFechaini_inha() != null) {
                if (fechadoc_not.before(modificasancion.getFechaini_inha())){
                    envelope.setContents("La fecha del Documento de Notificación debe ser mayor a la Fecha Inicial de la Sanción");
                    return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
                }
            }
            
            if (modificasancion.getFechafin_inha() != null) {
                if (fechadoc_not.after(modificasancion.getFechafin_inha())) {
                    envelope.setContents("La fecha del Documento de Notificación debe ser menor a la Fecha Final de la Sanción");
                    return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
                }
            }
            
            if(modificasancion.getSancion_estado().getCodigo()==2){
                if (fechadoc_not.before(modificasancion.getFecha_docnot())) {
                    envelope.setContents("La fecha del Documento de Notificación debe ser mayor a la Fecha de Notificación de la Sanción");
                    return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
                }
                if (anulacion.getFecha_doc_san().before(modificasancion.getFecha_docnot())) {
                    envelope.setContents("La fecha del Documento de Anulación debe ser mayor a la Fecha de Notificación de la Sanción");
                    return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
                }
            }else if(modificasancion.getSancion_estado().getCodigo()==3){
                nuevasuspension=(Suspension) session.load(Suspension.class, this.getBeanSuspension().get(0).getId());
                if (fechadoc_not.before(nuevasuspension.getFecha_docnoti())) {
                    envelope.setContents("La fecha del Documento de Notificación debe ser mayor a la Fecha de Notificación de la Suspensión.");
                    return new MultiZoneUpdate("busZone2", busZone2.getBody()).add("mensajeZone", mensajeZone.getBody());
                }
            }
            
            // (fecha_doc);
            anulacion.setFecha_doc_not(fechadoc_not);
            anulacion.setJuzgado(juzgado_not);
            anulacion.setId_sancion(modificasancion);
            anulacion.setId_tipo_doc_not(bdocumentoidentidad_not.getId());
            anulacion.setId_tipo_doc_san(bdocumentoidentidad2.getId());
            anulacion.setNumero_doc_not(bnumeroDocumento_not);
            anulacion.setNumero_doc_san(bnumeroDocumento2);
            anulacion.setEntidad(entidad_origen);
            session.saveOrUpdate(anulacion);
            session.flush();
            if (fechadoc_not.before(new Date()) || fechadoc_not.equals(new Date())) {
                modificasancion.setSancion_estado(getEstados().get(0));
            } else {
                modificasancion.setSancion_estado(getEstado_v().get(0));
            }

            session.saveOrUpdate(modificasancion);
            session.flush();
            //modificasancion
            envelope.setContents("Sancion Anulada con Exito");
            onLimpiar();
            return "ConsultaSanciones";
        }
        return "ConsultaSanciones";
    }
    
    @Log
    public List<LkBusquedaSuspension>  getBeanSuspension() {
        Criteria c = session.createCriteria(LkBusquedaSuspension.class);
        c.add(Restrictions.eq("sancion_id", modificasancion.getId()));         
        return c.list();
    } 

    @Log
    public List<DatoAuxiliar> getEstados() {
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.eq("nombreTabla", "ESTADOSANCION"));
        c.add(Restrictions.eq("codigo", (long) 3));
        return c.list();
    }

    @Log
    public List<DatoAuxiliar> getEstado_v() {
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.eq("nombreTabla", "ESTADOSANCION"));
        c.add(Restrictions.eq("codigo", (long) 1));
        return c.list();
    }
}